package com.xx.springboot.DataStructure.LeetCode.LinkedList;

/**
     给出一个链表，每 k 个节点一组进行翻转，并返回翻转后的链表。

     k 是一个正整数，它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍，那么将最后剩余节点保持原有顺序。

     示例 :

     给定这个链表：1->2->3->4->5

     当 k = 2 时，应当返回: 2->1->4->3->5

     当 k = 3 时，应当返回: 3->2->1->4->5

     说明 :

     你的算法只能使用常数的额外空间。
     你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
 */
public class reverseKGroup {


    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode curr = head;
        int count = 0;
        while (curr != null && count != k) {
            curr = curr.next;
            count++;
        }
        if (count == k) {
            curr = reverseKGroup(curr, k);
            while (count-- > 0) {
                ListNode tmp = head.next;
                head.next = curr;
                curr = head;
                head = tmp;
            }
            head = curr;
        }
        return head;
    }

    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6, 7};

        ListNode node = new ListNode(arr);

        ListNode cur = (new reverseKGroup()).reverseKGroup(node, 3);

        System.out.println(cur);

    }

}
